/* LUOGU P1113 杂务
拓扑排序，计算关键路径长度。
*/
#include <iostream>
#include <list>
#include <queue>
#include <sstream>
#include <vector>
using namespace std;

int main(){
  ios::sync_with_stdio(false); // 最多有10000*100项输入，优化输入。
  cin.tie(0);
  int n; // 杂务数目
  cin >> n >> ws;
  vector<int> vlen(n + 1); // 杂务耗时
  vector<int> inDegree(n + 1); // 入度
  vector<list<int> > vfwd(n + 1); // 正向邻接表，杂务的后继工作
  for(int i = 1, v; i <= n; ++i){
    string s;
    getline(cin, s);
    istringstream iss(s);
    iss >> v >> vlen[v];
    for(int u; iss >> u && u;){ // u是v的准备工作
      vfwd[u].push_back(v);
      inDegree[v] += 1;
    }
  }
  vector<int> endTime(n + 1); // 完成时间
  queue<int> q;
  for(int u = 1; u <= n; ++u){ // 至少有一项杂务不要求有准备工作
    if(inDegree[u] == 0){ // 无需准备，可以开始
      q.push(u);
      endTime[u] = vlen[u]; // 完成时间
    }
  }
  int max_time = 0;
  while(!q.empty()){
    int u = q.front();
    q.pop();
    for(int v : vfwd[u]){
      inDegree[v] -= 1; // 完成一项v的准备工作
      if(inDegree[v] == 0){ // 前驱完成，可以开工。
        q.push(v);
      }
      int t = endTime[u] + vlen[v];
      if(endTime[v] < t){
        endTime[v] = t;
        if(max_time < t){
          max_time = t;
        }
      }
    }
  }
  cout << max_time << endl;
}